package com.janetfilter.core.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 * 提供日期和时间的格式化和解析功能
 * 包含多种常用日期格式，如完整日期时间、日期部分、时间部分等
 */
public class DateUtils {
    /**
     * 完整日期时间格式: yyyy-MM-dd HH:mm:ss
     * 例如: 2022-01-01 12:30:45
     */
    public static final DateFormat FULL_DF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    /**
     * 带毫秒的完整日期时间格式: yyyy-MM-dd HH:mm:ss.SSS
     * 例如: 2022-01-01 12:30:45.123
     */
    public static final DateFormat FULL_MICRO_DF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    
    /**
     * 仅日期部分格式: yyyy-MM-dd
     * 例如: 2022-01-01
     */
    public static final DateFormat DATE_DF = new SimpleDateFormat("yyyy-MM-dd");
    
    /**
     * 仅时间部分格式: HH:mm:ss
     * 例如: 12:30:45
     */
    public static final DateFormat TIME_DF = new SimpleDateFormat("HH:mm:ss");

    /**
     * 将日期格式化为完整日期时间字符串
     * 
     * @param date 要格式化的日期
     * @return 格式化后的日期时间字符串 (yyyy-MM-dd HH:mm:ss)
     */
    public static String formatDateTime(Date date) {
        return FULL_DF.format(date);
    }

    /**
     * 将当前日期格式化为完整日期时间字符串
     * 
     * @return 格式化后的当前日期时间字符串 (yyyy-MM-dd HH:mm:ss)
     */
    public static String formatDateTime() {
        return formatDateTime(new Date());
    }

    /**
     * 将日期格式化为带毫秒的完整日期时间字符串
     * 
     * @param date 要格式化的日期
     * @return 格式化后的带毫秒的日期时间字符串 (yyyy-MM-dd HH:mm:ss.SSS)
     */
    public static String formatDateTimeMicro(Date date) {
        return FULL_MICRO_DF.format(date);
    }

    /**
     * 将当前日期格式化为带毫秒的完整日期时间字符串
     * 
     * @return 格式化后的带毫秒的当前日期时间字符串 (yyyy-MM-dd HH:mm:ss.SSS)
     */
    public static String formatDateTimeMicro() {
        return formatDateTimeMicro(new Date());
    }

    /**
     * 将日期格式化为仅包含日期部分的字符串
     * 
     * @param date 要格式化的日期
     * @return 格式化后的日期字符串 (yyyy-MM-dd)
     */
    public static String formatDate(Date date) {
        return DATE_DF.format(date);
    }

    /**
     * 将当前日期格式化为仅包含日期部分的字符串
     * 
     * @return 格式化后的当前日期字符串 (yyyy-MM-dd)
     */
    public static String formatDate() {
        return formatDate(new Date());
    }

    /**
     * 将日期格式化为仅包含时间部分的字符串
     * 
     * @param date 要格式化的日期
     * @return 格式化后的时间字符串 (HH:mm:ss)
     */
    public static String formatTime(Date date) {
        return TIME_DF.format(date);
    }

    /**
     * 解析时间字符串为Date对象
     * 
     * @param timeStr 要解析的时间字符串 (HH:mm:ss)
     * @return 解析后的Date对象
     * @throws ParseException 如果字符串格式不正确
     */
    public static Date parseTime(String timeStr) throws ParseException {
        return TIME_DF.parse(timeStr);
    }

    /**
     * 解析日期字符串为Date对象
     * 
     * @param dateStr 要解析的日期字符串 (yyyy-MM-dd)
     * @return 解析后的Date对象
     * @throws ParseException 如果字符串格式不正确
     */
    public static Date parseDate(String dateStr) throws ParseException {
        return DATE_DF.parse(dateStr);
    }

    /**
     * 解析完整日期时间字符串为Date对象
     * 
     * @param dateTimeStr 要解析的日期时间字符串 (yyyy-MM-dd HH:mm:ss)
     * @return 解析后的Date对象
     * @throws ParseException 如果字符串格式不正确
     */
    public static Date parseDateTime(String dateTimeStr) throws ParseException {
        return FULL_DF.parse(dateTimeStr);
    }
}
